package redtankface.tasks;

import redtankface.EnemyInfo;
import redtankface.RedTankFace;
import redtankface.TankUtils;

/**
 * FireTask
 */
public class FireTask extends AbstractTankChooseTask {
    private static final double DISTANCE_WEIGHT = 1;
    /** Базовая цена выстрела */
    private static final double START_FIRE_COST = 300;

    private long mLastFire = 0;
	/** Повышает приоритет стрельбы, если давно не стреляи. Надо иногда постреливать :) */
    private static final long FIRE_AGE_WEIGHT = 30;
    /** Стоимость поворота пушки */
    private static final double GUN_ANGLE_WIDTH = 10;

	private static final double ACCURACY_WEIGHT = 5;
	/** Чем старше данные, тем меньше рейтинг */
	public static final double FIRE_AGE_REDUCE = 50;
	/** Минимальная дистанция, после которой дается доп. бонус */
	private static final double MIN_DISTANCE = 150;
	/** Цена бонуса за каждый шаг после мин. дистанции */
	private static final double MIN_DISTACNCE_COST = 10;

	public FireTask(RedTankFace aRobot) {
		super(aRobot);
	}


	/**
	 * Ставит оценку резонности атакования танка
	 */
    @Override
	protected long getLocalRating(EnemyInfo enemy, double distance, double heading) {
		double cost = START_FIRE_COST; // Базовая оценка
		cost -= distance * DISTANCE_WEIGHT;
		// Понижает рейтинг, если данные со скана - старые
		cost -= Math.max(mRobot.getTime() - enemy.getTime(), 1) * FIRE_AGE_REDUCE;
		// Поднимает желание стребльбы, если давно не стрелял
        cost += (mRobot.getTime() - mLastFire) * FIRE_AGE_WEIGHT;
		// Штраф за угол
        cost -= Math.abs(TankUtils.getAngle(mRobot.getCoord(), enemy.getCoord(mRobot.getTime()))) * GUN_ANGLE_WIDTH;
		// Прибавка за меткость
		cost += Math.max(enemy.getHitCount(), 1) / Math.max(enemy.getFireCount(), 1) * ACCURACY_WEIGHT;

		if (distance < MIN_DISTANCE) {
			cost += (MIN_DISTANCE - distance) * MIN_DISTACNCE_COST;
		}

		System.out.println("Attack rating for " + enemy.getName() + " is " + (long)cost);

		return (long)cost;
	}

	@Override
	public void p_doTask() {
		mRobot.fireEnemy(bestEnemy);
        mLastFire = mRobot.getTime();
	}
}
